using System;
using System.Data.Linq;
using System.Collections.Generic;
using System.IO;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace libntregsharp
{
	public class Hive
	{
		public Hive() {}
		
		public Hive (string path)
		{
			Regex regex = new RegFBlock().Regex;
			
			Console.WriteLine ("\n" + path);
			
			using (FileStream fs = File.OpenRead (path)) {
				var data = new byte[checked((int)fs.Length)];
				int i = 0;
				int read;
				
				using (var ms = new MemoryStream (checked((int)fs.Length))) {
					
					while ((read = fs.Read (data, 0, data.Length)) > 0) {
						ms.Write (data, 0, read);
						i += read;
					}
					
					byte[] hive = ms.ToArray ();
					char[] cList = new char[fs.Length];
					
					i = 0;
					foreach (byte b in hive)
						cList[i++] = (char)b;
					
					string d = new string (cList);
					
					
					if (!Regex.IsMatch(d, regex.ToString()))
					{
						Console.WriteLine("Not a hive.");
						return;
					}
				
					FindAllHbins(d);
					
					
					
//					int all = 0;
//					
//					foreach (Regex rx in regexs) {
//						int oldIndex = 0;
//						
//						foreach (Match mx in rx.Matches (d)) {							
//							int index = d.IndexOf (mx.Value);
//							
//							if (index < oldIndex)
//								throw new Exception ("check the indices!");
//							
//							if (mx.Value.StartsWith("nk"))
//								nodes.Add (new NodeKey (index, hive));
//							else if (mx.Value.StartsWith("vk"))
//								values.Add(new ValueKey (index, hive));
//							
//							all++;
//							
//							oldIndex = index;
//						}
//						
//						//Console.WriteLine (values.Count);
//						//var bhfdsda = nodes.SelectMany(n => n.OffsetFromZero 
//							
//						all = 0;
//					}
				}
			}
		}

//		public int NumberOfKeys {
//			get {
//				if (_keys == null)
//					return 0;
//				
//				return _keys.Count;
//			}
//		}

//		public List<IKey> Keys {
//			get {
//				if (_keys == null)
//					_keys = new List<IKey> ();
//				
//				return _keys;
//			}
//
//			set { _keys = value; }
//		}
		
		private void FindAllHbins(string hive)
		{
			Regex hbinRegex = new HBinBlock().Regex;
			bool end = false;	
			
			while (!end)
			{
				int i = hive.IndexOf(hbinRegex.ToString());
				
				byte[] hbin = new byte[512]; //4k
				
				for (int k = 0;k < hbin.Length;k++)
					hbin[k] = (byte)hive[i + k];
				
				
			}
		}
		
		private void FindAllNodeKeys(byte[] hbin)
		{
			
		}
	}
	
}

